package 代码随想录.字符串;

public class _5左旋转字符串 {
    /**
     * 剑指 Offer 58 - II. 左旋转字符串
     * https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/
     * 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。
     * 比如，输入字符串"abcdefg"和数字2，该函数将返回左旋转两位得到的结果"cdefgab"。
     */
    public String reverseLeftWords(String s, int n) {
        if(s.length()==0 || s.isEmpty())
            return "";
        int m = s.length();
        n = n % m ;
        char[] strNum = s.toCharArray();

        //[a b c W X Y Z]
        //第一次逆转全部元素  [Z Y X W c b a]
        reverse(strNum, 0, m - 1);
        //第二次只逆转开头m-n个 [W X Y Z c b a]
        reverse(strNum, 0, m - n - 1);
        //第三次只逆转结尾n个  [W X Y Z a b c]
        reverse(strNum, m - n, m - 1);
        return new String(strNum);
    }
    //交换函数
    private void swap(char[] s, int a, int b){
        char temp = s[a];
        s[a] = s[b];
        s[b] = temp;
    }
    //反转函数
    private void reverse(char[] s, int start, int end){
        while(start < end){
            swap(s, start++, end--);
        }
    }
}
